home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / dpp / istream.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  6KB  |  282 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16. #line 16 "istream.d"
  17. #include <ctype.h> 
  18. #include <string.h> 
  19.  
  20. #include "dpp.h" 
  21.  
  22. #define MAXBUF 4096 
  23. #define MAXWORDSZ 256 
  24.  
  25.  
  26. #define strne(a, b) strcmp(a, b) 
  27. #define streq(a, b) !strcmp(a, b) 
  28.  
  29. #define istart(x) (isalpha(x) || (x) == '_') 
  30. #define irest(x) (isalnum(x) || (x) == '_') 
  31.  
  32.  
  33. #ifdef unix 
  34. #define RMODE "r" 
  35. #define WMODE "w" 
  36. #else 
  37. #define RMODE "rt" 
  38. #define WMODE "wt" 
  39. #endif 
  40.  
  41. #define    CLASS    InputStream_c
  42. #define    ivType    InputStream_iv_t
  43.  
  44. #include "generics.h"
  45.  
  46. object    InputStream_c;
  47.  
  48.  
  49. #line 50 "istream.c"
  50. typedef struct  _InputStream_iv_t  {
  51.     object iStream;
  52.     long iLine;
  53.     char * iBuf;
  54.     char * iPtr;
  55. }    InputStream_iv_t;
  56.  
  57.  
  58. #line 48 "istream.d"
  59. extern objrtn open_file(char *file,char *mode); 
  60.  
  61.  
  62. cmeth objrtn InputStream_cm_gNew(object self)
  63.     return gShouldNotImplement(self, "gNew"); 
  64.  
  65. cmeth objrtn InputStream_cm_gNewWithStr(object self, char *file)
  66.     object s, obj; 
  67.     ivType *iv; 
  68.  
  69.     s = open_file(file, RMODE); 
  70.     if (!s) 
  71.         return NULL; 
  72.     obj = oSuper(InputStream_c, gNew, self)(self); 
  73.     iv = ivPtr(obj); 
  74.     iv->iStream = s; 
  75.     iv->iBuf = Tnalloc(char, MAXBUF); 
  76.     *iv->iBuf = '\0'; 
  77.     iv->iPtr = iv->iBuf; 
  78.     return obj; 
  79.  
  80. imeth objrtn InputStream_im_gDispose(object self)
  81. { InputStream_iv_t *iv = GetIVs(InputStream, self);
  82.     gDispose(iv->iStream); 
  83.     free(iv->iBuf); 
  84.     return oSuper(InputStream_c, gDispose, self)(self); 
  85.  
  86. imeth objrtn InputStream_im_gGCDispose(object self)
  87. { InputStream_iv_t *iv = GetIVs(InputStream, self);
  88.     free(iv->iBuf); 
  89.     return oSuper(InputStream_c, gGCDispose, self)(self); 
  90.  
  91.  
  92.  
  93. static int get_line(ivType *iv) 
  94.     char *tbuf; 
  95.     int something = 0, i; 
  96.  
  97.     tbuf = iv->iBuf; 
  98.     *tbuf = '\0'; 
  99.     while (1) { 
  100.         if (!gGets(iv->iStream, tbuf, MAXBUF-strlen(iv->iBuf))) 
  101.             break; 
  102.         iv->iLine++; 
  103.         something = 1; 
  104.         i = strlen(tbuf) - 1; 
  105.         while (i >= 0 && (tbuf[i] == '\n' || tbuf[i] == '\r')) 
  106.             i--; 
  107.         if (i < 0 || tbuf[i] != '\\') { 
  108.             tbuf[i+1] = '\0'; 
  109.             break; 
  110.         } 
  111.         tbuf[i] = '\0'; 
  112.         tbuf += i; 
  113.     } 
  114.     return something; 
  115.  
  116.  
  117. #define IS(a, b) *iv->iPtr == a && iv->iPtr[1] == b 
  118. #define IS3(a, b, c) *iv->iPtr == a && iv->iPtr[1] == b && iv->iPtr[2] == c 
  119.  
  120. #define CODE_STATE 1 
  121. #define COMMENT_STATE 2 
  122.  
  123.  
  124.  
  125. static int next_token(ivType *iv) 
  126.     int state = CODE_STATE; 
  127.  
  128.     while (1) { 
  129.         if (!*iv->iPtr) 
  130.             if (get_line(iv)) 
  131.             iv->iPtr = iv->iBuf; 
  132.         else 
  133.             return 0; 
  134.         else if (state == CODE_STATE) { 
  135.             if (isspace(*iv->iPtr)) 
  136.                 iv->iPtr++; 
  137.             else if (IS('/', '/')) 
  138.                 *iv->iPtr = '\0'; 
  139.             else if (IS('/', '*')) { 
  140.                 state = COMMENT_STATE; 
  141.                 iv->iPtr += 2; 
  142.             } else 
  143.                 return 1; 
  144.         } else { 
  145.             if (IS('*', '/')) { 
  146.                 iv->iPtr += 2; 
  147.                 state = CODE_STATE; 
  148.             } else 
  149.                 iv->iPtr++; 
  150.         } 
  151.     } 
  152.  
  153.  
  154. imeth objrtn InputStream_im_gNextToken(object self)
  155. { InputStream_iv_t *iv = GetIVs(InputStream, self);
  156.     char *w, token[MAXWORDSZ]; 
  157.     int i; 
  158.  
  159.     if (!next_token(iv)) 
  160.         return NULL; 
  161.     w = token; 
  162.     if (istart(*iv->iPtr)) 
  163.         for (i=0 ; ++i <= MAXWORDSZ && irest(*iv->iPtr) ;) 
  164.         *w++ = *iv->iPtr++; 
  165.     else 
  166.         if (IS3('<', '<', '=') || 
  167.         IS3('>', '>', '=') || 
  168.         IS3(':', ':', '*') || 
  169.         IS3('-', '>', '*') || 
  170.         IS3('.', '.', '.')) { 
  171.         *w++ = *iv->iPtr++; 
  172.         *w++ = *iv->iPtr++; 
  173.         *w++ = *iv->iPtr++; 
  174.     } else if (IS('*', '=') || 
  175.         IS('/', '=') || 
  176.         IS('%', '=') || 
  177.         IS('+', '=') || 
  178.         IS('-', '=') || 
  179.         IS('&', '=') || 
  180.         IS('^', '=') || 
  181.         IS('|', '=') || 
  182.         IS('&', '&') || 
  183.         IS('|', '|') || 
  184.         IS('=', '=') || 
  185.         IS('!', '=') || 
  186.         IS('<', '<') || 
  187.         IS('>', '>') || 
  188.         IS('<', '=') || 
  189.         IS('>', '=') || 
  190.         IS('-', '-') || 
  191.         IS('+', '+') || 
  192.         IS(':', ':') || 
  193.         IS('.', '*') || 
  194.         IS('-', '>')) { 
  195.         *w++ = *iv->iPtr++; 
  196.         *w++ = *iv->iPtr++; 
  197.     } else if (*iv->iPtr == '"' || *iv->iPtr == '\'') { 
  198.         char type = *iv->iPtr; 
  199.         *w++ = *iv->iPtr++; 
  200.         while (*iv->iPtr && *iv->iPtr != type) { 
  201.             *w++ = *iv->iPtr; 
  202.             if (*iv->iPtr == '\\' && iv->iPtr[1]) 
  203.                 *w++ = *++iv->iPtr; 
  204.             ++iv->iPtr; 
  205.         } 
  206.         if (*iv->iPtr) 
  207.             *w++ = *iv->iPtr++; 
  208.     } else if (isdigit(*iv->iPtr) || *iv->iPtr == '.' && isdigit(iv->iPtr[1])) { 
  209.         int hex; 
  210.  
  211.         if (hex = (*iv->iPtr == '0' && (iv->iPtr[1] == 'x' || iv->iPtr[1] == 'X'))) { 
  212.             *w++ = *iv->iPtr++; 
  213.             *w++ = *iv->iPtr++; 
  214.         } 
  215.         while ((hex ? isxdigit(*iv->iPtr) : isdigit(*iv->iPtr)) || *iv->iPtr == '.' || *iv->iPtr == 'e' || *iv->iPtr == 'E' 
  216.             || ((*iv->iPtr=='-' || *iv->iPtr=='+') && 
  217.             (iv->iPtr[-1] == 'e' || iv->iPtr[-1] == 'E')) ) 
  218.             *w++ = *iv->iPtr++; 
  219.         if (*iv->iPtr == 'u' || *iv->iPtr == 'U' || *iv->iPtr == 'l' || *iv->iPtr == 'L') 
  220.             *w++ = *iv->iPtr++; 
  221.         if (*iv->iPtr == 'u' || *iv->iPtr == 'U' || *iv->iPtr == 'l' || *iv->iPtr == 'L') 
  222.             *w++ = *iv->iPtr++; 
  223.     } else 
  224.         *w++ = *iv->iPtr++; 
  225.     *w = '\0'; 
  226.  
  227.     i = isspace(*iv->iPtr) || !*iv->iPtr || 
  228.         iv->iPtr[0] == '/' && iv->iPtr[1] == '*' || 
  229.         iv->iPtr[0] == '/' && iv->iPtr[1] == '/'; 
  230.     return gNewToken(Token, token, iv->iLine, i); 
  231.  
  232.  
  233. #line 245 "istream.c"
  234.  
  235. objrtn    InputStream_initialize(void)
  236. {
  237.     static  CRITICALSECTION  cs;
  238.     static  int volatile once = 0;
  239.  
  240.     ENTERCRITICALSECTION(_CI_CS_);
  241.     if (!once) {
  242.         INITIALIZECRITICALSECTION(cs);
  243.         once = 1;
  244.     }
  245.     LEAVECRITICALSECTION(_CI_CS_);
  246.  
  247.     ENTERCRITICALSECTION(cs);
  248.  
  249.     if (InputStream_c) {
  250.         LEAVECRITICALSECTION(cs);
  251.         return InputStream_c;
  252.     }
  253.     INHIBIT_THREADER;
  254.     InputStream_c = gNewClass(Class, "InputStream", sizeof(InputStream_iv_t), 0, END);
  255.     cMethodFor(InputStream, gNewWithStr, InputStream_cm_gNewWithStr);
  256.     cMethodFor(InputStream, gNew, InputStream_cm_gNew);
  257.     iMethodFor(InputStream, gDispose, InputStream_im_gDispose);
  258.     iMethodFor(InputStream, gGCDispose, InputStream_im_gGCDispose);
  259.     iMethodFor(InputStream, gNextToken, InputStream_im_gNextToken);
  260.     iMethodFor(InputStream, gDeepDispose, InputStream_im_gDispose);
  261.  
  262.     ENABLE_THREADER;
  263.  
  264.     LEAVECRITICALSECTION(cs);
  265.  
  266.     return InputStream_c;
  267. }
  268.  
  269.  
  270.  
  271.